package sessions;

import dao.DocumentoJpaController;
import entities.Documento;
import entities.Mensaje;
import entities.Usuario;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Singleton;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

@Singleton
public class PersistenciaBean implements PersistenciaBeanRemote, PersistenciaBeanLocal {

    private Statement orden;
    private String driver = "org.postgresql.Driver";
    //String connectString = "jdbc:postgresql://localhost:5432/UPSAM";
    String connectString = "jdbc:postgresql://213.27.233.98:5432/UPSAM";
    String user = "postgres";
    String password = "postgres";
    static PersistenciaBean instance = null;
    Connection con;

    public PersistenciaBean() throws NamingException, SQLException {
        try {
            // Conexion a postgresql
            Class.forName(driver);
            con = DriverManager.getConnection(connectString, user, password);
            //conexion a derby
            //Connection con = null;

            InitialContext ic = new InitialContext();
            System.out.println("Localizador --> PersistenciaBean1");
            System.out.println("Antes de la conexion pool");
            //DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/myDatasourceTrfSgr");
            DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/myDatasourceDatosSeguros");
            System.out.println("Despues de la conexion pool");
            con = ds.getConnection();
            System.out.println("Despues de getConnection");
            //return con;
            //fin conexion derby

            orden = con.createStatement();
        } catch (Exception e) {
            e.getMessage();
        }
        //} catch (ClassNotFoundException ex) {
        //  Logger.getLogger(PersistenciaBean.class.getName()).log(Level.SEVERE, null, ex);
        //}
    }

    public static PersistenciaBean getInstance() throws Exception {
        if (instance == null) {
            instance = new PersistenciaBean();
        }
        return instance;
    }

    boolean recuperarMensajes(Usuario usuario) {
        ConexionBean dBean = new ConexionBean();
        //DatoInfo dato = new DatoInfo();
        con = null;
        ResultSet rs = null;
        PreparedStatement pStatement = null;
        try {
            con = dBean.getConnection();
            System.out.println("id usuario --> " + usuario.getId());
            String sql = "SELECT * FROM APP.USUARIOS_MENSAJES WHERE ID_USUARIO = " + usuario.getId();
            pStatement = con.prepareStatement(sql);
            //pStatement.setString(1, usuario.getEmail());
            rs = pStatement.executeQuery();
            System.err.println("Estamos en EJB.verMss");
            //System.err.println(rs.next());
            ArrayList contenedorMensajes;
            contenedorMensajes = new ArrayList();
            boolean vacio = true;
            while (rs.next()) {
                ResultSet rs2 = null;
                PreparedStatement pStatement2 = null;
                Mensaje mensaje = new Mensaje();
                mensaje.setIdUsuario(usuario.getId());
                mensaje.setIdDestinatario(rs.getInt("ID_MSS"));
                //fichero.setNombre(rs.getString("NOMBRE"));
                //fichero.setFichero("")
                System.out.println("Tiene mensajes --> " + mensaje.toString());

                vacio = false;
                sql = "SELECT * FROM APP.FICHERO WHERE ID = " + mensaje.getId();
                pStatement2 = con.prepareStatement(sql);
                //pStatement.setString(1, usuario.getEmail());
                System.out.println("antes de recoger id de tabla fichero");
                rs2 = pStatement2.executeQuery();
                while (rs2.next()) {
                    //mensaje.setNombre(rs2.getString("NOMBRE"));
                    mensaje.setId(rs2.getInt("ID"));
                    System.out.println("antes de meter en contenedor");
                    contenedorMensajes.add(mensaje);
                    System.out.println("Despues de meter en contenedor");
                }
                rs2.close();
                pStatement2.close();
            }
            usuario.setContenedorMensajes(contenedorMensajes);
            if (vacio) {
                System.err.println("No tiene ficheros asociados.");
            }
        } catch (Exception e) {
            System.out.println("Error --> " + e.getLocalizedMessage());

        }
        try {
            rs.close();
            pStatement.close();
            con.close();
            return true;
        } catch (Exception ex) {
            System.out.println("Error en el cierre de la base de datos");
            return false;
        }

        //throw new UnsupportedOperationException("Not yet implemented");
    }

    public Usuario login(Usuario usuario) {


        try {
            System.out.println("PersistenciaBean --> antes de consulta. Veo si existe el usuario.email --> " + usuario.getEmail() + "; usuario.pass --> " + usuario.getPassword());

            ResultSet res = orden.executeQuery("SELECT * FROM public.usuario WHERE email='" + usuario.getEmail() + "' AND password='" + usuario.getPassword() + "'");
            //ResultSet res = orden.executeQuery("SELECT * FROM APP.USUARIOS WHERE EMAIL='" + usuario.getEmail() + "' AND PASS='" + usuario.getPassword() + "'");
            System.out.println("PersistenciaBean --> despues de consulta");
            while (res.next()) {
                System.out.println("Usuario Registrado");
                usuario.setNombre(res.getString("nombre"));
                usuario.setEmail(res.getString("email"));
                usuario.setApellidos(res.getString("apellidos"));
                usuario.setId(res.getInt("ID"));
            }
            res.close();
            orden.close();
            return usuario;

        } catch (SQLException ex) {
            Logger.getLogger(PersistenciaBean.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public int addUsuario(Usuario usuario) {
        System.out.println("PersistenciaBean --> addUsuario --> " + usuario.getNombre() + ", " + usuario.getApellidos() + ", " + usuario.getPassword() + ", " + usuario.getEmail());
        try {
            if (comprobarEmail(usuario.getEmail()) == -1) {

                PreparedStatement preparado = con.prepareStatement("insert into public.usuario (nombre , apellidos, password, email, activacion, acuerdo) values('" + usuario.getNombre() + "','" + usuario.getApellidos() + "','" + usuario.getPassword() + "','" + usuario.getEmail() + "',true,true)");
                //int res1 = orden.executeUpdate("insert into public.usuario (nombre , apellidos, password, email, activacion, acuerdo) values('" + usuario.getNombre() + "','" + usuario.getApellidos() + "','" + usuario.getPassword() + "','" + usuario.getEmail() + "',true,true)");
                //int res1 = orden.executeUpdate(preparado);
                preparado.executeUpdate();
                System.out.println("PersistenciaBean --> addUsuario --> res " + preparado);
                preparado.close();
                return 1;
            } else {
                System.err.println("Email ya registrado");
                return -1;
            }
        } catch (Exception ex) {
            //Logger.getLogger(PersistenciaBean.class.getName()).log(Level.SEVERE, null, ex);
            System.err.println("Error en el alta " + ex.getMessage());
            return -1;
        }
    }

    @Override
    public int comprobarEmail(String email) {
        try {
            System.out.println("PersistenciaBean --> comprobarEmail --> " + email);
            ResultSet res = orden.executeQuery("SELECT * FROM public.usuario WHERE email='" + email + "'");
            //ResultSet res = orden.executeQuery("SELECT * FROM public.usuario WHERE email='" + usuario.getEmail() + "' AND password='" + usuario.getPassword() + "'");
            System.out.println("PersistenciaBean --> despues de comprobarEmail");
            if (res.next()) {
                System.out.println("PersistenciaBean --> email existente --> " + res.getString("email"));
                res.close();
                orden.close();
                return (1);
            } else {
                System.out.println("PersistenciaBean --> email no existente");
                res.close();
                orden.close();
                return (-1);
            }
        } catch (Exception e) {
            System.err.println("Error en PersistenciaBean --> comprobarEmail --> " + e.getStackTrace());
            return (-1);
        }
    }

    @Override
    public void cerrarSesion() {
        try {
            con.close();
        } catch (SQLException ex) {
            Logger.getLogger(PersistenciaBean.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public int addMensaje(Mensaje mensaje) {
        try {

            int res = orden.executeUpdate("INSERT INTO mensaje (ID_USUARIO, ID_DESTINATARIO, MENSAJE, ASUNTO, FECHAENVIO) "
                    + "VALUES (" + mensaje.getIdUsuario() + "," + mensaje.getIdDestinatario() + " , '" + mensaje.getMensaje() + "','" + mensaje.getAsunto() + "', " + mensaje.getFechaEnvio() + ")");
            return res;
        } catch (SQLException ex) {
            Logger.getLogger(PersistenciaBean.class.getName()).log(Level.SEVERE, null, ex);
            return -1;
        }
    }

    public List<Mensaje> buscarMensajeUsuario(Usuario usuario) {
        List<Mensaje> list = new ArrayList<Mensaje>();
        return list;
    }

    public Usuario buscarUsuarioPorNombre(String nombre) {
        Usuario u = new Usuario();
        return u;
    }

    public Usuario buscarUsuarioPorEmail(String email) {
        try {
            Usuario usuario = new Usuario();
            ResultSet res = orden.executeQuery("SELECT * FROM APP.USUARIOS WHERE EMAIL='" + email + "'");
            while (res.next()) {
                usuario.setNombre(res.getString("nombre"));
                usuario.setEmail(res.getString("email"));
                usuario.setApellidos(res.getString("apellidos"));
                usuario.setId(res.getInt("ID"));
            }
            return usuario;
        } catch (SQLException ex) {
            ex.printStackTrace();
            return null;
        }
    }

    public boolean recuperarFicheros1(Usuario usuario) {
        System.out.println("recuperarFicheros1");
        DocumentoJpaController dao = new DocumentoJpaController();
        System.out.println("recuperarFicheros1 creamos dao");
        Collection<persistencia.Documento> listaDocumentos = dao.findDocumentoEntities();
        System.out.println("recuperarFicheros1 reamos listaDocumentos");
        for (persistencia.Documento documento : listaDocumentos) {
            System.out.println("Nombre: " + documento.getNombre());
        }
        return true;
    }

    public boolean recuperarFicheros(Usuario usuario) {
        ConexionBean dBean = new ConexionBean();
        //DatoInfo dato = new DatoInfo();
        Connection con = null;
        ResultSet rs = null;
        PreparedStatement pStatement = null;
        try {

            con = dBean.getConnection();
            System.out.println("id usuario --> " + usuario.getId());
            String sql = "SELECT * FROM APP.USUARIOS_FICHEROS WHERE ID_USUARIO = " + usuario.getId();
            pStatement = con.prepareStatement(sql);
            //pStatement.setString(1, usuario.getEmail());
            rs = pStatement.executeQuery();
            System.err.println("Estamos en EJB.verFicheros");
            //System.err.println(rs.next());
            ArrayList contenedorFicheros;
            contenedorFicheros = new ArrayList();
            boolean vacio = true;
            while (rs.next()) {
                ResultSet rs2 = null;
                PreparedStatement pStatement2 = null;
                Documento fichero = new Documento();
                fichero.setIdUsuario(usuario.getId());
                fichero.setIdDocumento(rs.getInt("ID_FICHERO"));
                //fichero.setNombre(rs.getString("NOMBRE"));
                //fichero.setFichero("")
                System.out.println("Tiene ficheros --> " + fichero.toString());

                vacio = false;
                sql = "SELECT * FROM APP.FICHERO WHERE ID = " + fichero.getId();
                pStatement2 = con.prepareStatement(sql);
                //pStatement.setString(1, usuario.getEmail());
                System.out.println("antes de recoger id de tabla fichero");
                rs2 = pStatement2.executeQuery();
                while (rs2.next()) {
                    fichero.setNombre(rs2.getString("NOMBRE"));
                    fichero.setIdDocumento(rs2.getInt("ID"));
                    System.out.println("antes de meter en contenedor");
                    contenedorFicheros.add(fichero);
                    System.out.println("Despues de meter en contenedor");
                }
                rs2.close();
                pStatement2.close();
            }
            usuario.setContenedorFicheros(contenedorFicheros);
            if (vacio) {
                System.err.println("No tiene ficheros asociados.");
            }
        } catch (Exception e) {
            System.out.println("Error --> " + e.getLocalizedMessage());

        }
        try {
            rs.close();
            pStatement.close();
            con.close();
            return true;
        } catch (Exception ex) {
            System.out.println("Error en el cierre de la base de datos");
            return false;
        }

        //throw new UnsupportedOperationException("Not yet implemented");
    }
}
